import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * JDBC查询与新增操作练习题
 */
public class JdbcCrudExercise {
    // 数据库连接信息 (请将 "你的数据库名" 替换为实际的数据库名，如 library_management)
    private static final String URL = "jdbc:mysql://localhost:3306/library_management?useSSL=false&serverTimezone=Asia/Shanghai";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "666666zzzzzz";

    public static void main(String[] args) {
        // --- 任务一：查询操作 ---
        System.out.println("--- 开始执行查询操作 ---");
        queryUserByUsername("admin");

        System.out.println("\n--- 查询操作执行完毕 ---\n");

        // --- 任务二：新增操作 ---
        System.out.println("--- 开始执行新增操作 ---");
        // 准备要新增的用户数据
        String newUsername = "new_user_jdbc";
        String newPassword = "new_pass_123";
        String newName = "新用户";
        String newRole = "user";
        int newStatus = 1;
        String newEmail = "new_user@library.com";

        insertNewUser(newUsername, newPassword, newName, newRole, newStatus, newEmail);

        System.out.println("\n--- 新增操作执行完毕 ---");

        // --- 验证新增结果 ---
        System.out.println("\n--- 验证新增结果 ---");
        queryUserByUsername(newUsername);
    }

    /**
     * 任务一：根据用户名查询用户信息
     * @param username 要查询的用户名
     */
    public static void queryUserByUsername(String username) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 1. 获取数据库连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            // 2. 定义SQL语句，使用 ? 作为占位符
            String sql = "SELECT id, username, name, role, status, email FROM user WHERE username = ?";

            // 3. 创建 PreparedStatement 对象
            pstmt = conn.prepareStatement(sql);

            // 4. 为占位符设置值 (索引从 1 开始)
            pstmt.setString(1, username);

            // 5. 执行查询，获取结果集 ResultSet
            rs = pstmt.executeQuery();

            // 6. 处理结果集
            if (rs.next()) {
                // 如果查询到数据，从 ResultSet 中获取信息
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String role = rs.getString("role");
                int status = rs.getInt("status");
                String email = rs.getString("email");

                // 打印查询到的用户信息
                System.out.println("查询成功！找到用户:");
                System.out.println("ID: " + id);
                System.out.println("Username: " + username);
                System.out.println("Name: " + name);
                System.out.println("Role: " + role);
                System.out.println("Status: " + (status == 1 ? "正常" : "禁用"));
                System.out.println("Email: " + email);
            } else {
                // 如果没有查询到数据
                System.out.println("查询失败！未找到用户名为 '" + username + "' 的用户。");
            }

        } catch (Exception e) {
            System.err.println("查询操作失败！");
            e.printStackTrace();
        } finally {
            // 7. 关闭资源 (在实际开发中必须执行)
            try { if (rs != null) rs.close(); } catch (Exception e) { e.printStackTrace(); }
            try { if (pstmt != null) pstmt.close(); } catch (Exception e) { e.printStackTrace(); }
            try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); }
        }
    }

    /**
     * 任务二：新增一个新用户
     * @param username 新用户名
     * @param password 新用户密码
     * @param name 新用户真实姓名
     * @param role 新用户角色
     * @param status 新用户状态
     * @param email 新用户邮箱
     */
    public static void insertNewUser(String username, String password, String name, String role, int status, String email) {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            // 1. 获取数据库连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            // 2. 定义SQL语句，使用 ? 作为占位符
            String sql = "INSERT INTO user (username, password, name, role, status, email) VALUES (?, ?, ?, ?, ?, ?)";

            // 3. 创建 PreparedStatement 对象
            pstmt = conn.prepareStatement(sql);

            // 4. 为占位符设置值 (索引从 1 开始)
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            pstmt.setString(3, name);
            pstmt.setString(4, role);
            pstmt.setInt(5, status);
            pstmt.setString(6, email);

            // 5. 执行更新，获取受影响的行数
            int rowsAffected = pstmt.executeUpdate();

            // 6. 处理结果
            if (rowsAffected > 0) {
                System.out.println("新增成功！成功插入 " + rowsAffected + " 条记录。");
                System.out.println("新用户信息 -> Username: " + username + ", Name: " + name);
            } else {
                System.out.println("新增失败！没有记录被插入。");
            }

        } catch (Exception e) {
            // 注意：如果用户名已存在(违反UNIQUE约束)，这里会抛出SQL异常
            System.err.println("新增操作失败！可能原因：用户名已存在或数据格式错误。");
            e.printStackTrace();
        } finally {
            // 7. 关闭资源 (在实际开发中必须执行)
            try { if (pstmt != null) pstmt.close(); } catch (Exception e) { e.printStackTrace(); }
            try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); }
        }
    }
}